#include "stm32f4xx_hal.h"
#include "board.h"

void HAL_UART_MspInit(UART_HandleTypeDef* huart)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};
  if(huart->Instance == USART1)
  {
    __HAL_RCC_USART1_CLK_ENABLE();                              // 使能USART1时钟
    __HAL_RCC_GPIOA_CLK_ENABLE();                               // 使能GPIOA时钟
    /*  USART1 引脚配置    
    PA9  ------> USART1_TX
    PA10 ------> USART1_RX 
    */
    GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10;               // 选择PIN_9, PIN10
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;                     // 复用推挽输出
    GPIO_InitStruct.Pull = GPIO_PULLUP;                         // 上拉
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;          // 高速
    GPIO_InitStruct.Alternate = GPIO_AF7_USART1;                // 复用为USART1
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);                     // 按上述配置初始化GA9，PA10

    HAL_NVIC_SetPriority(USART1_IRQn, BOARD_CONFIG_USART1_PREEMPT_PRIO, 0);// 设置USART1中断优先级
    HAL_NVIC_EnableIRQ(USART1_IRQn);                            // 使能USART1中断
  }
  else if(huart->Instance==USART3)
  {
  /* USER CODE BEGIN USART3_MspInit 0 */

  /* USER CODE END USART3_MspInit 0 */
    /* Peripheral clock enable */
    __HAL_RCC_USART3_CLK_ENABLE();

    __HAL_RCC_GPIOD_CLK_ENABLE();
    /**USART3 GPIO Configuration
    PD8     ------> USART3_TX
    PD9     ------> USART3_RX
    */
    GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF7_USART3;
    HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);

  /* USER CODE BEGIN USART3_MspInit 1 */

  /* USER CODE END USART3_MspInit 1 */
  }
  else if(huart->Instance == UART4)
  {
    __HAL_RCC_UART4_CLK_ENABLE();                               // 使能USART4时钟
    __HAL_RCC_GPIOC_CLK_ENABLE();                               // 使能GPIOC时钟
    /*  USART1 引脚配置    
    PC10  ------> USART4_TX
    PC11  ------> USART4_RX 
    */
    GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_11;              // 选择PIN_10, PIN11
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;                     // 复用推挽输出
    GPIO_InitStruct.Pull = GPIO_PULLUP;                         // 上拉
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;          // 高速
    GPIO_InitStruct.Alternate = GPIO_AF8_UART4;                 // 复用为USART4
    HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);                     // 按上述配置初始化PC10，PC11

    HAL_NVIC_SetPriority(UART4_IRQn, 0, 0);                     // 设置UART4中断优先级，抢占优先级0，子优先级0
    HAL_NVIC_EnableIRQ(UART4_IRQn);                             // 使能UART4中断
  }
}

void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)
{
  if(huart->Instance == USART1)
  {
    __HAL_RCC_USART1_CLK_DISABLE();                             // 失能USART1时钟
    /*  USART1 引脚配置
    PA9  ------> USART1_TX
    PA10 ------> USART1_RX 
    */
    HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10);             // 将PA9，PA10初始化为默认值
    HAL_NVIC_DisableIRQ(USART1_IRQn);                           // 失能USART1中断
  }
  else if(huart->Instance == UART4)
  {
    __HAL_RCC_UART4_CLK_DISABLE();                              // 失能UART4时钟
    /*  USART1 引脚配置
    PA2  ------> USART2_TX
    PA3  ------> USART2_RX 
    */
    HAL_GPIO_DeInit(GPIOC, GPIO_PIN_10|GPIO_PIN_11);            // 将PC10，PC11初始化为默认值
    HAL_NVIC_DisableIRQ(UART4_IRQn);                            // 失能UART4中断
  }
}

